home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / UIFlow 1.0.1 / UIFlow Source / VSet2.0 / temp / vsetf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-12  |  8.0 KB  |  324 lines  |  [TEXT/????]

  1. /*****************************************************************************
  2. *              NCSA HDF Vset release 2.1
  3. *                    May 1991
  4. *
  5. * NCSA HDF Vset release 2.1 source code and documentation are in the public
  6. * domain.  Specifically, we give to the public domain all rights for future
  7. * licensing of the source code, all resale rights, and all publishing rights.
  8. * We ask, but do not require, that the following message be included in all
  9. * derived works:
  10. * Portions developed at the National Center for Supercomputing Applications at
  11. * the University of Illinois at Urbana-Champaign.
  12. * THE UNIVERSITY OF ILLINOIS GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE
  13. * SOFTWARE AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION,
  14. * WARRANTY OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE
  15. *****************************************************************************
  16. * Likkai Ng May 1991  NCSA 
  17. *
  18. * vsetf.c
  19. * Part of the HDF VSet interface.
  20. *
  21. ************************************************************************/
  22.  
  23. /*
  24. #include <ctype.h> 
  25. */
  26.  
  27. #include "vg.h"
  28. /* 
  29. ** ==================================================================
  30. ** PRIVATE data areas and routines
  31. ** ==================================================================
  32. **/
  33.  
  34. /*
  35. stores sizes of local machine's known types 
  36. */
  37.  
  38. PRIVATE int local_sizetab[] = 
  39. {
  40.         LOCAL_UNTYPEDSIZE,
  41.         LOCAL_CHARSIZE,
  42.         LOCAL_INTSIZE,
  43.         LOCAL_FLOATSIZE,
  44.         LOCAL_LONGSIZE,
  45. };
  46.  
  47. PRIVATE SYMDEF rstab[] = 
  48. {
  49.         "PX",LOCAL_FLOATTYPE,    IEEE_FLOATSIZE, 1,
  50.         "PY",LOCAL_FLOATTYPE,    IEEE_FLOATSIZE, 1,
  51.         "PZ",LOCAL_FLOATTYPE,    IEEE_FLOATSIZE, 1,
  52.  
  53.         "IX",LOCAL_INTTYPE,        IEEE_INT16SIZE, 1,
  54.         "IY",LOCAL_INTTYPE,        IEEE_INT16SIZE, 1,
  55.         "IZ",LOCAL_INTTYPE,        IEEE_INT16SIZE, 1,
  56.  
  57.         "NX",LOCAL_FLOATTYPE,    IEEE_FLOATSIZE, 1,
  58.         "NY",LOCAL_FLOATTYPE,    IEEE_FLOATSIZE, 1,
  59.         "NZ",LOCAL_FLOATTYPE,    IEEE_FLOATSIZE, 1,
  60.  
  61. };
  62.  
  63. #define NRESERVED ( sizeof(rstab)/sizeof(SYMDEF) )
  64. #define SIZETAB_SIZE sizeof(local_sizetab)/sizeof(int)
  65.  
  66. /*
  67. ** returns the machine size of a field type
  68. */
  69.  
  70. int SIZEOF (x)
  71.  
  72. int x;
  73. {
  74.  
  75.     if (x<0 || x>SIZETAB_SIZE-1) {
  76.         return(FAIL);
  77.         }
  78.     else {
  79.         return(local_sizetab[x]);
  80.         }
  81. } /* SIZEOF */
  82.  
  83.  
  84. /* ------------------------------------------------------------------ */
  85. /*
  86. ** sets the fields in a vdata for reading or writing
  87. ** RETURNS -1 if error, and 1 if ok.
  88. ** truncates each field to max length of  FIELDNAMELENMAX.
  89. */
  90.  
  91. PUBLIC int VSsetfields (vs,fields)        /*@-@*/
  92.  
  93. VDATA *vs;
  94. char    *fields;
  95. {
  96.     char  **av;
  97.     int     ac, i,j,found, order;
  98.     VREADLIST     rlist;
  99.     VWRITELIST  wlist;
  100.  
  101.     if (vs==NULL) return(FAIL);
  102.     if (scanattrs(fields,&ac,&av) < 0) {
  103.         sprintf(sjs,"@bad fields string [%s]\n",fields);
  104.         zj;
  105.         return(FAIL); /* bad fields string */
  106.     }
  107.     if (ac==0) return(FAIL);
  108.  
  109.     if (vs->access == 'w') { /* ===== W R I T E  access ============== */
  110.         if ( vs->nvertices > 0) {
  111.             sprintf(sjs,"@\t*cannot set fields - data already exists\n");
  112.             zj;
  113.             return(FAIL);
  114.         }
  115.  
  116.         wlist        = vs->wlist;
  117.         wlist.ivsize = 0;
  118.         wlist.n      = 0;
  119.         for(i=0;i<ac;i++) {
  120.             /* --- first look in the reserved symbol table --- */
  121.             for(found=0,j=0;j<NRESERVED;j++)
  122.                 if (!strcmp(av[i], rstab[j].name)) {
  123.                     found = 1;
  124.  
  125.                     strcpy( wlist.name[wlist.n],rstab[j].name);
  126.                     order = rstab[j].order;
  127.                     wlist.type[wlist.n]  =  rstab[j].type;
  128.                     wlist.order[wlist.n] =  order;
  129.                     wlist.esize[wlist.n] =  order * SIZEOF(rstab[j].type);
  130.                     wlist.isize[wlist.n] =  order * rstab[j].isize;
  131.                     wlist.ivsize  += wlist.isize[wlist.n];
  132.                     wlist.n++;
  133.                     break;
  134.                 }
  135.  
  136.             /* --- now look in the user's symbol table --- */
  137.             if(!found) {
  138.                 for(found=0,j=0;j<vs->nusym;j++)
  139.                     if (!strcmp(av[i], vs->usym[j].name)) {
  140.                         found = 1;
  141.  
  142.                         strcpy (wlist.name[wlist.n],vs->usym[j].name);
  143.                         order = vs->usym[j].order;
  144.                         wlist.type[wlist.n]  =  vs->usym[j].type;
  145.                         wlist.order[wlist.n] = order;
  146.                         wlist.esize[wlist.n] = order * SIZEOF(vs->usym[j].type);
  147.                         wlist.isize[wlist.n] = order *  vs->usym[j].isize;
  148.                         wlist.ivsize+= wlist.isize[wlist.n];
  149.                         wlist.n++;
  150.                         break;
  151.                     }
  152.             }
  153.             if (!found) {    /* field is not a defined field - error  */
  154.                 sprintf(sjs,"@Vsetfield:field [%s] unknown\n",av[i]);
  155.                 zj;
  156.                 return(FAIL);
  157.             }
  158.         }
  159.  
  160.         /* *********************************************************** */
  161.         /* ensure fields with order>1 are alone  */
  162.         for (j=0,i=0;i<wlist.n;i++)
  163.             if (wlist.order[i] >1 && wlist.n != 1) {
  164.                 sprintf(sjs,"@Vsetf: [%s] in [%s] has order %d. error.\n",
  165.                     wlist.name[i], fields, wlist.order[i]);
  166.                 zj;
  167.                 return(FAIL);
  168.             }
  169.         /* *********************************************************** */
  170.  
  171.         /* compute and save the fields' offsets */
  172.         for (j=0,i=0;i<wlist.n;i++) {
  173.             wlist.off[i] =j;
  174.             j += wlist.isize[i];
  175.         }
  176.  
  177.         /* copy from wlist (temp) into vdata */
  178.         movebytes((unsigned char*) &(wlist), (unsigned char*) &(vs->wlist),sizeof(wlist));
  179.  
  180.         return(1); /* ok */
  181.  
  182.     } /* "w" */
  183.  
  184.     else if (vs->access == 'r') {  /* ===== R E A D  access ============== */
  185.  
  186.         rlist   = vs->rlist;
  187.         rlist.n = 0;
  188.         for (i=0;i<ac;i++) {
  189.             for (found=0,j=0;j<vs->wlist.n;j++)
  190.                 if (!strcmp(av[i], vs->wlist.name[j]) ) {/*  see if field exist */
  191.                     found = 1;
  192.  
  193.                     rlist.item[rlist.n] = j; /* save as index into wlist->name */
  194.                     rlist.n++;
  195.                     break;
  196.                 }
  197.             if (!found)  {    /* field does not exist - error */
  198.                 sprintf(sjs,"@Vsetfield: field [%s] does not exist in vs\n",
  199.                     av[i]);
  200.                 zj;
  201.                 return(FAIL);
  202.             }
  203.         }
  204.  
  205.         /* copy from rlist (temp) into vdata */
  206.         movebytes((unsigned char*) &(rlist), (unsigned char*) &(vs->rlist),sizeof(rlist));
  207.  
  208.         return(1); /* ok */
  209.  
  210.     } /* "r" */
  211.  
  212. } /* VSsetfields */
  213.  
  214. /* ------------------------------------------------------------------ */
  215. /* 
  216. ** defines a (one) new field within the vdata 
  217. */
  218.  
  219. PUBLIC int VSfdefine (vs, field, localtype, order)    /*@-@*/
  220.  
  221. VDATA *vs;
  222. char  *field;
  223. int   localtype, order;
  224. {
  225.     char **av;
  226.     int  ac;
  227.     char *ss;
  228.     int j, usymid, replacesym;
  229.  
  230.     if (vs==NULL) return(FAIL);
  231.  
  232.     if (scanattrs(field,&ac,&av) < 0) {
  233.         sprintf(sjs,"@bad field string [%s] in Vfdefine\n",field);
  234.         zj;
  235.         return(FAIL);
  236.     }
  237.     if (ac!=1) return(FAIL); /* only one field item can be defined per call */
  238.  
  239.     if (order <1 || order > 1000) {
  240.         sprintf(sjs,"@VSfdefine: error order %d\n",order);
  241.         zj;
  242.         return(FAIL);
  243.     }
  244.  
  245.     /* 
  246.     ** check for any duplicates 
  247.     */
  248.     /* --- first look in the reserved symbol table --- */
  249.     for (j=0;j<NRESERVED;j++)
  250.         if (!strcmp(av[0], rstab[j].name)) {
  251.             sprintf(sjs,"@VSfdefine warning: predefined field [%s] redefined.\n",
  252.             av[0]); zj;
  253.             break;
  254.            }
  255.     /* --- then look in the user's symbol table --- */
  256.     for (replacesym = 0,j=0;j<vs->nusym;j++)
  257.         if (!strcmp(av[0], vs->usym[j].name)) {
  258.             sprintf(sjs,"@VSfdefine warning: field [%s] redefined.\n",av[0]); zj;
  259.             replacesym = 1;
  260.             break;
  261.            }
  262.  
  263.    if (replacesym)  
  264.         usymid = j; /* new definition will replace old at this index */
  265.    else 
  266.         usymid = vs->nusym;
  267.  
  268.     switch (localtype) {
  269.  
  270.     case LOCAL_FLOATTYPE:
  271.         vs->usym[usymid].isize  =    IEEE_FLOATSIZE;
  272.         break;
  273.     case LOCAL_INTTYPE:
  274.         vs->usym[usymid].isize  =    IEEE_INT16SIZE;
  275.         break;
  276.     case LOCAL_CHARTYPE:
  277.         vs->usym[usymid].isize  =    IEEE_CHARSIZE;
  278.         break;
  279.     case LOCAL_LONGTYPE:
  280.         vs->usym[usymid].isize  =    IEEE_INT32SIZE;
  281.         printf("@Vfdefine: [%s] defined as long \n",av[0]);
  282.         break;
  283.     default:
  284.         sprintf(sjs,"@Vfdefine: bad type (=%d) for [%s]\n",localtype,av[0]);
  285.         zj;
  286.         return(FAIL);
  287.         break;
  288.  
  289.     } /* switch */
  290.  
  291.     j  = strlen(av[0])+1;
  292.  
  293.     if( (ss = (char*) DFIgetspace(j))==NULL)
  294.         return(FAIL);                          /* cannot alloc space */
  295.  
  296.         
  297.     strcpy(ss,av[0]);
  298.     vs->usym[usymid].name  = ss;
  299.     vs->usym[usymid].type  = localtype;
  300.     vs->usym[usymid].order = order;
  301.  
  302.    /* prevent user-symbol table overflow */
  303.     if (vs->nusym >=USYMMAX) {
  304.         sprintf(sjs,"@VSFDEFINE: %d too many symbols\n",vs->nusym); zj;
  305.         for(j=0;j<vs->nusym;j++)
  306.             { sprintf(sjs,"@ sym: %d [%s]\n",j,vs->usym[j]); zj; }
  307.         return(FAIL);
  308.     }
  309.  
  310.     /* increment vs->nusym only if no user field has been redefined */
  311.     if (!replacesym) vs->nusym++;
  312.  
  313.    return(1); /* ok */
  314.  
  315. } /* VSfdefine */
  316.  
  317. /* ------------------------------------------------------------------ */
  318.  
  319.